// 封装requestAPI
import {storageGet,storageClear} from './storage.js'
import {msgTip, msgTipAlert} from './MsgTipApi'
import {userStore} from '../store/userStore'
class WxRequest{
  constructor(params){
    Object.assign(this.defaultOptions, params)
  }
  defaultOptions = {
    data:null,
    header:{
      "Content-type": "application/json"
    },
    timeout: 60000
  }
  //定义拦截器-默认拦截器
  interceptors = {
    request: (config)=> config,
    response: (response)=> response
  }

  // 定义加载请求的次数
  req_list = []

  request(options){
    // if(this.timer){
    //   clearTimeout(this.timer)
    // }
    options.url = this.defaultOptions.baseUrl + options.url;
    // 合并optios
    options = {...this.defaultOptions, ...options}
    // 调用拦截器
    this.interceptors.request(options)
    if(options.method == "UPLOAD"){
      return new Promise((resolve, reject) =>{
        wx.uploadFile({
          ...options,
          success: (res)=> {
            resolve(resolve(JSON.parse(res.data)))
          },
          fail: (err)=>{
            console.log("上传失败了");
          }
        })
      })
    }else{
      return new Promise((resolve, reject)=>{
        // 1. 首先进来的时候，判断列表是否为空,并新增一条请求数据
        // this.req_list.length === 0 ? wx.showLoading() : ''
        // this.req_list.push('req')
        wx.request({
          ...options,
          success: (res)=>{
            resolve(this.interceptors.response(res))
          },
          fail:(err)=>{
            reject(this.interceptors.response(res))
          },
          complete:(res)=>{
            // 2 为了防止请求与请求之间有先后顺序造成加载闪烁问题，先在req_list为空的情况下加入1个标识
            // if(this.req_list.length === 0){
            //   this.req_list.push('req')
            // }
            // 3. 无论如何，在这里处理掉请求列表中的一个标识，在请求进来之前也需要清理一次定时器
          //  this.timer = setTimeout(()=>{
          //     this.req_list.pop()
          //     this.req_list.length === 0 && wx.hideLoading()
          //     clearTimeout(this.timer)
          //   }, 10)
          }
          
        })
      })
    }
  }

  // 封装方法
  get(url,data={},config={}){
    return this.request(Object.assign({url,data,method:'GET'},config))
  }
  post(url,data={},config={}){
    return this.request(Object.assign({url,data,method:'POST'},config))
  }
  delete(url,data={},config={}){
    return this.request(Object.assign({url,data,method:'DELETE'},config))
  }
  put(url,data={},config={}){
    return this.request(Object.assign({url,data,method:'PUT'},config))
  }
  // 文件上传服务的封装
  upload(url, filePath, name="file", config={}){
    return this.request(Object.assign({url, filePath, name, method:"UPLOAD"}),config)
  }
}

const instance = new WxRequest({ baseUrl: 'http://localhost:8000/'})
instance.interceptors.request = (config)=>{
  let token = storageGet('token')
  // console.log("1. 设置token之前",config); ？？？在设置之前就拥有token？
  if(token){
    config.header.token = token
  }
  return  config
}

instance.interceptors.response = (resp)=>{
  
  let {data} = resp 
  if(data.respCode == 200){
    return data.data
  }
  if(data.respCode == 201){
    msgTip({title:"处理异常，请稍后重试"})
  }
  if(data.respCode == 401 || data.respCode == 403){
    // msgTipAlert({content:"token过期或鉴权失败，请重新登录",showCancel: false  })
    
    wx.showModal({
      title: '提示',
      content: 'token过期或鉴权失败，请重新登录',
      showCancel: false,
      complete: (res) => {    
        if (res.confirm) {
          storageClear()
          userStore.updateToken("")
          userStore.updateUserInfo("")
          wx.navigateTo({
            url: '/pages/login/login',
          })
        }
      }
    })
    return
  }
  if(data.respCode == 500){
    console.log('进入服务器内部失败');
    return 
  }
}

export {instance}